import Snake from "./Snake";
import Food from "./Food";
import ScorePanel from "./ScorePanel";

// 游戏控制器
class GameControl {
	// 定义三个属性
	// 蛇
	snake: Snake
	// 食物
	food: Food
	// 记分牌
	scorePanel: ScorePanel
	// 存储蛇的移动方向 => 初始方向向右
	direction: string = 'Right'
	// 创建属性记录游戏是否结束
	isLive: Boolean = true

	constructor() {
		this.snake = new Snake()
		this.food = new Food()
		this.scorePanel = new ScorePanel(10, 2)
		this.init()
	}

	// 游戏初始化方法, 调用后游戏开始
	init() {
		// 绑定键盘按下的事件
		document.addEventListener('keydown', this.keydownHandler.bind(this))
		this.run()
	}

	// 创建一个键盘按下的响应函数
	keydownHandler(event: KeyboardEvent) {
		this.direction = event.key
	}

	// 蛇移动的方法
	run() {
		// 获取蛇现在的坐标
		let X = this.snake.X
		let Y = this.snake.Y

		// 根据方向修改x与y值
		switch(this.direction) {
			case 'ArrowUp':
			case 'Up':
				// 向上 => Top-
				Y -= 10
				break
			case 'ArrowDown':
			case 'Down':
				// 向下 => Top+
				Y += 10
				break
			case 'ArrowLeft':
			case 'Left':
				// 向左 => left-
				X -= 10
				break
			case 'ArrowRight':
			case 'Right':
				// 向左 => left+
				X += 10
				break
		}

		this.checkEat(X, Y)

		try {
			// 修改蛇相应的坐标
			this.snake.X = X
			this.snake.Y = Y
		} catch(e) {  // 捕获撞墙错误
			alert((e as any).message)
			this.isLive = false
		}

		this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30)
	}

	// 检查蛇是否吃到食物的方法
	checkEat(X: number, Y: number) {
		if(X === this.food.X && Y === this.food.Y) {
			// 食物的位置进行重置
			this.food.change()
			// 分数增加
			this.scorePanel.addScore()
			// 蛇增加一节
			this.snake.addBody()
		}
	}
}

export default GameControl